package pl.edu.pk.psb.validator;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

import pl.edu.pk.psb.command.PolaczenieCommand;
import pl.edu.pk.psb.command.PrzystanekCommand;
import pl.edu.pk.psb.command.WydarzenieCommand;

@Component
public class PrzystanekValidator extends OgolnyValidator implements Validator {

	private static final String WALIDACJA_NIEPOPRAWNA_WARTOSC = "walidacja.niepoprawnaWartosc";

	@Override
	public void validate(Object obiekt, Errors bledy) {
		PrzystanekCommand command = (PrzystanekCommand) obiekt;
		if (!czyPoprawnyString(command.getNazwa(), true)) {
			bledy.rejectValue("nazwa", "walidacja.pusta");
		}
		if (!czyPoprawnyString(command.getMiasto(), true)) {
			bledy.rejectValue("miasto", "walidacja.pusta");
		}
		if (!czyPrzystankiBezPowtorzen(command.getPrzystankiPolaczone())) {
			bledy.rejectValue("przystankiPolaczone",
					"walidacja.powtorzeniaPrzystankow");
		}
		if (!czyOdleglosciWiekszeOdZera(command.getOdleglosci())) {
			bledy.rejectValue("odleglosci",
					"walidacja.odleglosciNieWiekszeNizZero");
		}
		if (!czyCenaWiekszaOdZera(command.getCenaPrzejazdu())) {
			bledy.rejectValue("cenaPrzejazdu",
					"walidacja.koszt");
		}
	}

	private boolean czyCenaWiekszaOdZera(List<Double> cenaPrzejazdu) {
		boolean czyWiekszeOdZera = true;
		for (Double i : cenaPrzejazdu) {
			if (i < 1) {
				czyWiekszeOdZera = false;
				break;
			}
		}
		return czyWiekszeOdZera;
	}

	private boolean czyOdleglosciWiekszeOdZera(List<Integer> odleglosci) {
		boolean czyWiekszeOdZera = true;
		for (Integer i : odleglosci) {
			if (i < 1) {
				czyWiekszeOdZera = false;
				break;
			}
		}
		return czyWiekszeOdZera;
	}

	private boolean czyPrzystankiBezPowtorzen(List<Integer> przystankiPolaczone) {
		boolean czyBezPowtorzen = false;
		Set<Integer> przystanki = new HashSet<Integer>(przystankiPolaczone);
		if (przystankiPolaczone.size() == przystanki.size())
			czyBezPowtorzen = true;
		return czyBezPowtorzen;
	}

	@Override
	public boolean supports(Class<?> klasa) {
		return PrzystanekCommand.class.isAssignableFrom(klasa);
	}
}
